package cn.xianyang.server.impl;

import cn.xianyang.domain.Movie;
import cn.xianyang.domain.User;
import cn.xianyang.feignclient.MovieFeignClient;
import cn.xianyang.mapper.UserMapper;
import cn.xianyang.server.IUserServer;
import cn.xianyang.utils.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserServerImpl implements IUserServer {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private MovieFeignClient movieFeignClient;

    @Override
    public AjaxResult buyTickets(Long number, Long id, Long uid) {
        //查询用户 用于余额判断
        User user =userMapper.findById(uid);
        //查询电影 用于获取电影票价
        Movie movie = movieFeignClient.findById(id);
        //这里是熔断 用的 如果调用接口 为nulll 则熔断 为什么这里返回值不用Result 是因为我懒的用json转对象 所以只能这样判断
        if(movie==null){
            return new AjaxResult(false,"网络错误，请稍后再试",null);
        }
        //获取购票总金额
        Double totalPrice = number*movie.getPrice();
        //判断余额是否充足
        if(user.getBalance() < totalPrice){
            return new AjaxResult(false,"余额不足，请充值",null);
        }else {
            //由于接口需要map 所以只能使用map传参 前面偷的懒 现在还
            Map<String, Object> map = new HashMap<>();
            map.put("number",number);
            map.put("id",id);
            AjaxResult result = movieFeignClient.buyTickets(map);
            //一样用于判断是否熔断
            if(result.isSuccess()==false){
                return result;
            }
            //修改用户余额
            userMapper.update(totalPrice,uid);
            //循环添加用户电影票中间表 为什么不用批量添加 因为我懒
            for(Long i =number;i>0;i--){
                userMapper.buyTickets(number,id,uid);
            }
            //返回结果
            return new AjaxResult(true,movie.getName()+number+"张购买成功！！",null) ;
        }
    }

    /**
     * 观影流程 所需参数 由于检票是一个一个的进行 则只需要用户id 和观看电影的id
     * @param uid
     * @param id
     * @return
     */
    @Override
    public AjaxResult watch(Long uid, Long id) {

        //查询用户是否有票
        List<Long> tickets=userMapper.hasTicket(uid,id);

        if (tickets.isEmpty()){
            return new AjaxResult(false,"你未持有该票！",null);
        }else {
            userMapper.watch(uid, id);
            return new AjaxResult(true, "请入厅观看", null);
        }
    }

    @Override
    public User add(User user) {
        userMapper.add(user);
        return user;
    }

    @Override
    public void giveTickets(User user) {
        //获取最多余票的电影
        Movie movie = movieFeignClient.findMaxTicket();
        //添加中间表信息
        userMapper.giveTickets(user.getId(),movie.getId());
    }
}
